[DMS] S3 TargetのCDCにUPDATE/DELETEが出力されるようになっていました
こんにちは、菊池です。
Database Migration Service(DMS)では、データレプリケーション先にS3が選択可能です。
S3 Targetがサポートされた当初、継続的なデータレプリケーション(Change Data Capture:CDC)の対象はInsertのみで、UPDATE/DELETEは記録されませんでした。ところが、最近試したところ、CDCでもUPDATE/DELETEの更新についても記録されるようになっていました。
なお、本記事執筆時点(2017/6/5)でも、公式ドキュメントには以下のような記載があります。
Limitations to Using Amazon S3 as a Target
The following limitations apply to a file in Amazon S3 that you are using as a target:
- UPDATE and DELETE statements are not supported.
UPDATE/DELETEの出力
MongoDB to S3へのマイグレーションでCDCの出力を確認しました。MongoDB Sourceのマイグレーションモードはドキュメントモードを利用しています。
まずは転送元のコレクションにデータを登録しておきます。
s0-rs0:PRIMARY> db.contacts.insert({name:"hoge1", city: "Tokyo", phone:"090-xxxx-xxxx"}); WriteResult({ "nInserted" : 1 }) s0-rs0:PRIMARY> db.contacts.insert({name:"hoge2", city: "Kanagawa", email:"hoge2@example1.com"}); WriteResult({ "nInserted" : 1 }) s0-rs0:PRIMARY> db.contacts.insert({name:"hoge3", city: "Chiba" }); WriteResult({ "nInserted" : 1 })
この状態でDMSのタスク(フルロード/CDC)を実行します。フルロードでS3に出力されたファイルを確認します。
$ cat LOAD00000001.csv" "{ ""_id"" : { ""$oid"" : ""5934e486ee12fb67cd5d8032"" }, ""name"" : ""hoge1"", ""city"" : ""Tokyo"", ""phone"" : ""090-xxxx-xxxx"" }" "{ ""_id"" : { ""$oid"" : ""5934e48eee12fb67cd5d8033"" }, ""name"" : ""hoge2"", ""city"" : ""Kanagawa"", ""email"" : ""hoge2@example1.com"" }" "{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" }, ""name"" : ""hoge3"", ""city"" : ""Chiba"" }"
続けて、CDCを確認するため、MongoDBのデータを更新します。
s0-rs0:PRIMARY> db.contacts2.insert({name:"hoge4", city: "Tokyo", phone:"090-zzzz-zzzz"}); WriteResult({ "nInserted" : 1 }) s0-rs0:PRIMARY> db.contacts.update({name:"hoge3"}, {name:"hoge3", city: "Saitama"}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
しばらくすると、更新データがS3に出力されます。
$ cat 20170605-0505337058.csv U,"{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" }, ""name"" : ""hoge3"", ""city"" : ""Saitama"" }" I,"{ ""_id"" : { ""$oid"" : ""5934e670ee12fb67cd5d8036"" }, ""name"" : ""hoge4"", ""city"" : ""Tokyo"", ""phone"" : ""090-zzzz-zzzz"" }"
行われた操作が、I(INSERT)、U(UPDATE)のように先頭カラムに追記されています。
続けて、ドキュメントの削除を試します。
s0-rs0:PRIMARY> db.contacts.deleteOne({name:"hoge3"}) { "acknowledged" : true, "deletedCount" : 1 }
こちらも、ファイルを確認してみるとD(DELETE)として記録されています。
$ cat 20170605-0513342260.csv D,"{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" } }"
CDCでもS3 Targetの場合、以前はPDATE/DELETEについては何も出力されませんでしたが、更新情報が出力されるようになりました。出力されたファイルを時系列に確認することで、データ更新をトレースできます。
さいごに
いかがでしょうか。
UPDATE/DELETEが出力されることで、データの変更については正しく追跡可能になりました。S3をデータレイクとしてEMRやRedshiftに連携するなど、使い方に広がりが期待できます。
一方で、ドキュメント上、サポートされないような記載があるのが気になりますので、このあたりの更新情報もウォッチしていきたいと思います。